package com.atguigu.gmall.activity.controller;

import com.atguigu.gmall.activity.service.ActivityInfoService;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.activity.ActivityInfo;
import com.atguigu.gmall.model.activity.ActivityRuleVo;
import com.atguigu.gmall.model.enums.ActivityType;
import com.atguigu.gmall.model.product.SkuInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author atguigu-mqx
 */
@RestController
@RequestMapping("admin/activity/activityInfo") // 全局的映射路径
public class ActivityInfoController {

    @Autowired
    private ActivityInfoService activityInfoService;

    //  http://localhost/admin/activity/activityInfo/1/5
    @GetMapping("{page}/{limit}")
    public Result getPage(@PathVariable Long page,
                          @PathVariable Long limit){
        //  创建一个Page 对象
        Page<ActivityInfo> infoPage = new Page<>(page,limit);

        IPage<ActivityInfo> activityInfoPage = activityInfoService.getPage(infoPage);

        //  返回数据：
        return Result.ok(activityInfoPage);
    }

    //  保存活动：
    //  http://localhost/admin/activity/activityInfo/save
    //  前端传递的数据是Json ---> JavaObject
    @PostMapping("save")
    public Result save(@RequestBody ActivityInfo activityInfo){
        //  手动赋值活动的创建时间：
        activityInfo.setCreateTime(new Date());
        //  调用服务层方法
        activityInfoService.save(activityInfo);
        //  默认返回成功
        return Result.ok();
    }

    //  批量删除
    //  http://localhost/admin/activity/activityInfo/batchRemove
    //  前端传递的是多个数据的Id 后台就需要接受到这个Id 数据
    @DeleteMapping("batchRemove")
    public Result batchRemove(@RequestBody List<Long> idList){
        //  调用服务层的删除方法
        activityInfoService.removeByIds(idList);
        //  默认返回成功！
        return Result.ok();
    }

    //  单个删除
    //  http://localhost/admin/activity/activityInfo/remove/4
    @DeleteMapping("remove/{id}")
    public Result remove(@PathVariable Long id){

        //  调用服务层的删除方法
        activityInfoService.removeById(id);

        //  返回数据
        return Result.ok();
    }
    //  内容回显
    //  http://localhost/admin/activity/activityInfo/get/2
    @GetMapping("get/{id}")
    public Result getById(@PathVariable Long id){
        //  调用服务层方法获取数据
        ActivityInfo activityInfo = activityInfoService.getById(id);
        //  要给activityTypeString 赋值：根据它activity_type
        activityInfo.setActivityTypeString(ActivityType.getNameByType(activityInfo.getActivityType()));

        //  返回数据
        return Result.ok(activityInfo);
    }

    //  修改控制器：
    //  http://localhost/admin/activity/activityInfo/update
    //  获取到前端传递的数据：Json ---> JavaObject
    @PutMapping("update")
    public Result update(@RequestBody ActivityInfo activityInfo){
        //  调用服务层方法
        activityInfoService.updateById(activityInfo);

        //  返回数据
        return Result.ok();
    }

    //  保存活动规则的控制器
    //  前端传递的数据：Json 数据 ----> JavaObject
    @PostMapping("saveActivityRule")
    public Result saveActivityRule(@RequestBody ActivityRuleVo activityRuleVo){
        //  调用服务层方法进行保存
        activityInfoService.saveActivityRule(activityRuleVo);
        //  数据返回
        return Result.ok();
    }

    // 关键关键字查询skuInfo 列表数据
    @GetMapping("findSkuInfoByKeyword/{keyword}")
    public Result findSkuInfoByKeyword(@PathVariable String keyword){
        //  调用服务层方法
        List<SkuInfo> skuInfoList = activityInfoService.findSkuInfoByKeyword(keyword);
        return Result.ok(skuInfoList);
    }

    //  http://localhost/admin/activity/activityInfo/findActivityRuleList/8
    @GetMapping("findActivityRuleList/{id}")
    public Result findActivityRuleList(@PathVariable Long id){
        //  调用服务层方法 :
        Map<String,Object> map = activityInfoService.findActivityRuleList(id);
        //  返回map 是因为，我需要将页面渲染的数据都一次性放入map 中，然后页面需要根据这个map 渲染即可！
        return Result.ok(map);
    }
}
